/****************************************************************************
**
** Copyright (C) 2011 Jesús Martínez Pérez
**
** This program is free software: you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the 
** Free Software Foundation, either version 3 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but 
** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along 
** with this program. If not, see <http://www.gnu.org/licenses/>
**
****************************************************************************/
#include <tabla.h>


tabla::tabla(int tipo){
	Vbits v(0);
	if(tipo==1){//Tabla 1: Tabla de bits adicionales para la codificación de las longitudes.
		tab=new info[259];
		tab[3].codigo=257;
		tab[4].codigo=258;
		tab[5].codigo=259;
		tab[6].codigo=260;
		tab[7].codigo=261;
		tab[8].codigo=262;
		tab[9].codigo=263;
		tab[10].codigo=264;
		for(int i=0; i<8;i++){
			tab[i+11].codigo=265+i/2;
			tab[i+11].vb=Vbits(i%2,1);
		}
		for(int i=0; i<16;i++){
			tab[i+19].codigo=269+i/4;
			tab[i+19].vb=Vbits(i%4,2);
		}
		for(int i=0; i<32;i++){
			tab[i+35].codigo=273+i/8;
			tab[i+35].vb=Vbits(i%8,3);
		}
		for(int i=0; i<64;i++){
			tab[i+67].codigo=277+i/16;
			tab[i+67].vb=Vbits(i%16,4);
		}
		for(int i=0; i<127;i++){
			tab[i+131].codigo=281+i/32;
			tab[i+131].vb=Vbits(i%32,5);
		}
		tab[258].codigo=285;
	}
	if(tipo==2){//Tabla 2: Tabla de bits adicionales para la codificación de las distancias.
		tab=new info[32768];
		tab[0].codigo=0;
		tab[1].codigo=1;
		tab[2].codigo=2;
		tab[3].codigo=3;
		int nbits=1;
		int i=4;
		for(int cod=4;(cod<30);cod++){
			for(int b=0;b<(1<<nbits);b++,i++){
				tab[i].codigo=cod;
				Vbits Vb(b,nbits);
				tab[i].vb=Vb;
			}
			if(cod%2==1){
				nbits++;
			}
		}
	}		
	if(tipo==3){//Tabla 3: Coeficientes de la codificación de Huffman para caracteres y símbolos de longitud.
	tab=new info[287];
		for(int i=0;i<144;i++){
			tab[i].codigo=i;
			tab[i].vb=Vbits(i+48,8);
		}
		for(int i=144;i<256;i++){
			tab[i].codigo=i;
			tab[i].vb=Vbits(i+256,9);
		}
		for(int i=256;i<280;i++){
			tab[i].codigo=i;
			tab[i].vb=Vbits(i-256,7);
		}
		for(int i=280;i<288;i++){
			tab[i].codigo=i;
			tab[i].vb=Vbits(i-88,8);
		}
	}
	if(tipo==4){//Tabla 4: Coeficientes de la codificación de Huffman para símbolos de distancia.
		tab=new info[30];
		for(int i=0;i<31;i++){
			tab[i].codigo=i;
			tab[i].vb=Vbits(i,5);
		}
	}
}

	
Vbits tabla::GetVb(int n)const{
	Vbits v(tab[n].vb);
	return v;
}


int tabla::codigo(int n)const{
	return tab[n].codigo;
}


info tabla::Gettab(int pos)const{
	return tab[pos];
}
